﻿#region 참조 네임스페이스

using Microsoft.Win32;
using System.IO;

#endregion

namespace Skying.IO
{
	/// <summary>
	/// <see cref="System.IO.File"/> 클래스의 Static 확장 메서드를 제공한다.
	/// </summary>
	public static class FileHelper
	{
		#region 상수

		/// <summary>
		/// ContentType의 기본형 상수를 나타낸다.
		/// </summary>
		public const string _DEFAULT_CONTENT_TYPE = "application/octetstream";

		/// <summary>
		/// 레지스트리 상에서 ContentType을 가져오기 위한 키 상수를 나타낸다.
		/// </summary>
		public const string _CONTENT_TYPE_REGISTRY_KEY = "Content Type";

		#endregion

		#region 콘텐트 타입(Content Type)

		/// <summary>
		/// 파일에 대한 콘텐트 타입을 가져온다.
		/// </summary>
		/// <param name="fileName">파일의 전체 경로를 설정한다.</param>
		/// <returns>파일에 대한 콘텐트 타입이 반환된다. 파일이 존재하지 않을 경우에는 빈 문자열이 반환된다.</returns>
		public static string GetContentType(string fileName)
		{
			if (File.Exists(fileName)) return string.Empty;

			string contentType = "application/octetstream";
			
			string extension = Path.GetExtension(fileName).ToLower();

			RegistryKey registryKey = Registry.ClassesRoot.OpenSubKey(extension);

			if (registryKey != null && registryKey.GetValue("Content Type") != null)
			{
				contentType = registryKey.GetValue("Content Type").ToString();
			}

			return contentType;
		}

		#endregion

		#region FileInfo

		/// <summary>
		/// 디렉토리 경로 상의 파일들의 <see cref="System.IO.FileInfo"/> 배열을 얻는다.
		/// </summary>
		/// <param name="directoryPath">얻고자 하는 <see cref="System.IO.FileInfo"/>들이 위치하는 디렉토리 경로를 설정한다.</param>
		/// <returns><see cref="System.IO.FileInfo"/> 배열이 반환된다.</returns>
		public static FileInfo[] GetFileInfos(string directoryPath)
		{
			return GetFileInfos(Directory.GetFiles(directoryPath));
		}

		/// <summary>
		/// 파일 경로 목록으로부터 <see cref="System.IO.FileInfo"/> 배열을 얻는다.
		/// </summary>
		/// <param name="filePaths">파일 경로 목록을 설정한다.</param>
		/// <returns><see cref="System.IO.FileInfo"/> 배열이 반환된다.</returns>
		public static FileInfo[] GetFileInfos(string[] filePaths)
		{
			FileInfo[] fileInfos = new FileInfo[filePaths.Length];

			for (int index = 0; index < filePaths.Length; index++)
			{
				fileInfos[index] = new FileInfo(filePaths[index]);
			}

			return fileInfos;
		}

		#endregion
	}
}